package cn.wolfcode.rbac.service.impl;

import cn.wolfcode.rbac.domain.Department;
import cn.wolfcode.rbac.domain.Permission;
import cn.wolfcode.rbac.mapper.PermissionMapper;
import cn.wolfcode.rbac.query.PageResult;
import cn.wolfcode.rbac.query.QueryObject;
import cn.wolfcode.rbac.service.IPermissionService;
import cn.wolfcode.rbac.util.RequiredPermission;
import com.sun.jndi.ldap.LdapCtxFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;

import java.lang.reflect.Method;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

@Service
public class PermissionServiceImpl implements IPermissionService {

    @Autowired
    private PermissionMapper permissionMapper;

    @Override
    public void saveOrUpdate(Permission permission) {
        if (permission.getId()!=null){
            // id不为空,说明此时调用的是修改操作
            // Update 表名 set name=?,sn=? where id=?;
            permissionMapper.updateByPrimaryKey(permission);
        }else {
            // id为空,说明此时调用的是保存操作
            // insert into 表名(name,sn) values(?,?)
            permissionMapper.insert(permission);
        }
    }

    @Override
    public void delete(Long id) {
        permissionMapper.deleteByPrimaryKey(id);
    }

    @Override
    public Permission getOne(Long id) {
        Permission permission = permissionMapper.selectByPrimaryKey(id);
        return permission;
    }

    @Override
    public List<Permission> listAll() {
        List<Permission> permissions = permissionMapper.selectAll();
        return permissions;
    }

    @Override
    public PageResult query(QueryObject qo) {
        //查询总条数
        int totalCount = permissionMapper.queryForCount();
        //查询带有分页效果的结果集
        if (totalCount == 0){
            //查不出数据,调用的是pageResult类中的缺参构造器
            return new PageResult(qo.getCurrentPage(),qo.getPageSize());
        }

        List<Permission> data=permissionMapper.queryForList(qo);
        return new PageResult(data,totalCount,qo.getCurrentPage(),qo.getPageSize());
    }

    @Autowired
    private ApplicationContext ctx; // 创建 spring 容器对象

    @Override
    public void reload(){
        Set<String> expresions=permissionMapper.selectExpression();
        // 加载权限的业务逻辑，要把所有的controller方法上带有的@RequiredPermission 注解的信息保存到数据库中
        // 要先拿到所有的 controller ? 所有的 controller 都在spring容器当中，上spring容器拿到 controller
        Map<String, Object> map = ctx.getBeansWithAnnotation(Controller.class);
        // controller 在map的value里面，要获取所有的value
        // departmentController,employeeController,loginController,pernissionController,roleController
        Collection<Object> controllers=map.values();
        for(Object controller:controllers){
            // Controller要拿到每一个中的所有方法
            Method[] methods=controller.getClass().getMethods();
            for(Method method:methods){
                // 如果方法上有，那么把注解里面的信息那出来
                RequiredPermission annotation=method.getAnnotation(RequiredPermission.class);

                if(annotation!=null&& !expresions.contains(annotation.value()[1])){
                    String name=annotation.value()[0]; // 权限的名称
                    String expression =annotation.value()[1]; // 权限的表达式
                    Permission permission=new Permission();
                    permission.setName(name);
                    permission.setExpression(expression);
                    permissionMapper.insert(permission); // 保存到数据库
                }
            }
        }
    }

}
